﻿/**
 * FATFS测试文件
 *
 * 本工程为《FATFS完全学习指南》系列课程中的第一部分入门课程，介绍
 * FATFS基本的接口的使用。配套免费的视频课程用于学习。
 *
 * 作者：李述铜
 * 视频课程：https://lishutong1024.github.io
 * 配套资料：https://www.yuque.com/lishutong-docs/fatfs_api/cp15hpoflevfqxk7
 */
#include <stdio.h>
#include "../fatfs/source/ff.h"
#include "../fatfs/source/diskio.h"

// FATFS结构，以静态结构的方式定义，或者用malloc分配
static FATFS disk1_fs;			// 针对disk1.vhd
static FATFS disk2_fs;			// 针对disk2.vhd

static FRESULT remove_empty_dir(const TCHAR* path) {
	FILINFO info;
	DIR dir;

	// 首先切换到当前路径，避免要自己构建完整路径
	FRESULT res = f_chdir(path);
	if (res != FR_OK) {
		printf("chdir failed.\n");
		return res;
	}

	// 打开文件，不断进行遍历
	res = f_opendir(&dir, ".");
	if (res != FR_OK) {
		printf("remove failed.\n");
		return res;
	}

	// 不断读取文件信息，然后删除
	while (res == FR_OK) {
		res = f_readdir(&dir, &info);
		if (res != FR_OK) {
			printf("read dir failed\n");
			return res;
		}

		if (info.fname[0] == '\0') {
			break;
		}

		if (info.fattrib & AM_DIR) {
			// 删除目录
			res = remove_empty_dir(info.fname);
			if (res != FR_OK) {
				printf("unlink dir failed\n");
				return res;
			}
		} else {
			// 普通文件删除
			res = f_unlink(info.fname);
			if (res != FR_OK) {
				printf("unlink file failed\n");
				return res;
			}
		}
	}

	// 关闭目录
	f_closedir(&dir);

	// 切换到上层目录
	res = f_chdir("..");
	if (res != FR_OK) {
		printf("chdir failed.\n");
		return res;
	}

	// 最后删除该目录
	res = f_unlink(path);
	if (res != FR_OK) {
		printf("unlink dir failed\n");
		return res;
	}

	return FR_OK;
}

int main(void) {
	// 挂载文件系统
	FRESULT res = f_mount(&disk1_fs, "0:", 1);
	if (res != FR_OK) {
		printf("mount disk1 failed.\n");
		return -1;
	}

	// 挂载文件系统
	res = f_mount(&disk2_fs,  "1:", 1);
	if (res != FR_OK) {
		printf("mount disk2 failed.\n");
		return -1;
	}

	// 删除文件
	res = f_unlink("0:/rtos/os_sem.c");
	if (res != FR_OK) {
		printf("remove file failed.\n");
	} else {
		printf("remove file ok\n");
	}

	// 删除非空目录
	res = f_unlink("0:/rtos");
	if (res != FR_OK) {
		printf("remove dir failed.\n");
	} 

	// 递归删除
	remove_empty_dir("0:/rtos");

	// 卸载文件系统
	f_unmount( "0:");
	f_unmount( "1:");
	return 0;
}